package com.aptech.oas.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;

import javax.servlet.ServletContext;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 在做B/S系统时，通常会涉及到上传文件和下载文件，
 * 在struts2框架之前，都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传，
 * 但是那样做的话，代码看起来比较繁琐，而且不灵活，
 * 在学习了struts2后，struts2为文件上传下载提供了更好的实现机制，
 * 在这里我分别就单文件上传和多文件上传的源代码进行一下讲解，
 * 这里需要导入文件下载上传的两个jar文件，
 * 一个是commons-fileupload-1.2.2.jar，另一个是commons-io-2.0.1.jar
 */

/**
 *首先我们要清楚一点，这里的file并不是真正指代jsp上传过来的文件，
 *当文件上传过来时，struts2首先会寻找struts.multipart.saveDir(这个是在default.properties里面有)这个name所指定的存放位置，
 *我们可以新建一个struts.properties属性文件来指定这个临时文件存放位置，
 *如果没有指定，那么文件会存放在tomcat的apache-tomcat-7.0.29\work\Catalina\localhost\目录下，
 *然后我们可以指定文件上传后的存放位置，通过输出流将其写到流里面就行了，
 *这时我们就可以在文件夹里看到我们上传的文件了。
 *
 *文件上传后我们还需要将其下载下来，(用FileDownloadAction.java)
 *其实struts2的文件下载原理很简单，就是定义一个输入流，然后将文件写到输入流里面就行，
 *关键配置还是在struts.xml这个配置文件里配置：
 */

/**
 *访问地址为：进入上传页面
 *http://localhost:8181/oas/test/upload
 *
 */
public class FileUploadAction extends ActionSupport {

	private String username;
  //注意，file并不是指前端jsp上传过来的文件本身，而是文件上传过来存放在临时文件夹下面的文件
  private File file;
  
  //提交过来的file的名字
  private String fileFileName;
  
  //提交过来的file的MIME类型
  private String fileContentType;

  
@Override
  public String execute() throws Exception
  {
	  ServletContext context=ServletActionContext.getServletContext();
      String contextPath=context.getContextPath();
      String path=context.getRealPath("g:/attachment/newFolder");
      URL url=context.getResource("g:/attachment");
      String serverInfo=context.getServerInfo();
      String toString=context.toString();
      String ordered_libs=context.ORDERED_LIBS;
      String tempDir=context.TEMPDIR;
      InputStream nis=context.getResourceAsStream("g:/attachment/2016.07.12.txt");
      
      String root = "g:/attachment/test1";
      File file1=new File(root);
      file1.mkdirs();
      InputStream is = new FileInputStream(file);
      
      OutputStream os = new FileOutputStream(new File(file1, fileFileName));
      
      System.out.println("fileFileName: " + fileFileName);
      // 因为file是存放在临时文件夹的文件，我们可以将其文件名和文件路径打印出来，看和之前的fileFileName是否相同
      System.out.println("file: " + file.getName());
      System.out.println("file: " + file.getPath());
      
      byte[] buffer = new byte[1024];
      int length = 0;
      
      while(-1 != (length = is.read(buffer)))
      {
          os.write(buffer,0,length);
      }
      
      os.close();
      is.close();
      
      return SUCCESS;
  }

  
  
  public String getUsername()
  {
      return username;
  }

  public void setUsername(String username)
  {
      this.username = username;
  }

  public File getFile()
  {
      return file;
  }

  public void setFile(File file)
  {
      this.file = file;
  }

  public String getFileFileName()
  {
      return fileFileName;
  }

  public void setFileFileName(String fileFileName)
  {
      this.fileFileName = fileFileName;
  }

  public String getFileContentType()
  {
      return fileContentType;
  }

  public void setFileContentType(String fileContentType)
  {
      this.fileContentType = fileContentType;
  }
  

}
